home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / djgpp / contrib / pdcurs22 / src / tools / mm.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-02-13  |  3.6 KB  |  163 lines

  1. /*
  2.  * File   : mm.c
  3.  *
  4.  * Source : Based on mm.c by DJ Delorie.
  5.  */
  6.  
  7. #define _INCLUDE_POSIX_SOURCE
  8. #define _INCLUDE_XOPEN_SOURCE
  9.  
  10. #include <ctype.h>
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <string.h>
  14. #include <sys/stat.h>
  15. #include <unistd.h>
  16. #if defined(__WATCOMC__) || defined(MSC)
  17. #include <direct.h>
  18. #else
  19. #include <dirent.h>
  20. #endif
  21.  
  22. #ifdef __WATCOMC__
  23. #define   MAKETMPL    "maketmpl.wcc"
  24. #define   MAKEFILE    "makefile.wcc"
  25. #define   DIRSEP      '\\'
  26. #define   LINESEP     '&'
  27. #define   OBJEXT      "obj"
  28. #define   SOURCE      ""
  29. #define   OBJECT      "/fo="
  30. #else
  31. #define   MAKETMPL    "maketmpl"
  32. #define   MAKEFILE    "makefile.n"
  33. #define   DIRSEP      '/'
  34. #define   LINESEP     '\\'
  35. #define   OBJEXT      "o"
  36. #define   SOURCE      "-c "
  37. #define   OBJECT      "-o "
  38. #endif
  39.  
  40. void fail (char *s1, char *s2)
  41. {
  42.   fprintf (stderr, "ERROR: %s \"%s\"\n", s1, s2);
  43.   exit (EXIT_FAILURE);
  44. }
  45.  
  46. char *strlwr (char *s)
  47. {
  48. #ifdef MSDOS
  49.   char *p;
  50.  
  51.   for (p=s; *p; p++) *p = tolower(*p);
  52. #endif
  53.   return s;
  54. }
  55.  
  56. void handle_wild (FILE *f, char *dir, char *wild)
  57. {
  58.   int m, n;
  59.   DIR *dirp;
  60.   char *cp, fname[256];
  61.   struct dirent *dep;
  62.   struct stat stbuf;
  63.  
  64.   if ((dirp = opendir (dir)) == NULL) fail ("Illegal directory name", dir);
  65.  
  66.   while ((dep = readdir (dirp)) != NULL)
  67.   {
  68.     sprintf (fname, "%s%c%s", dir, DIRSEP, dep->d_name);
  69.     stat (fname, &stbuf);
  70.     strlwr (fname);
  71.     if ((stbuf.st_mode & S_IFMT) != S_IFDIR)   /* skip dirs */
  72.     {
  73.       if (((m = strlen(fname)) >= (n = strlen(wild))) &&
  74.              (!strcmp (fname + m - n, wild)))
  75.       {
  76.     fprintf (f, "\t$(ODIR)%c", DIRSEP);
  77.     sprintf (fname, "%s", dep->d_name);
  78.     strlwr (fname);
  79.     sprintf (strrchr(fname,'.'), ".%s %c\n", OBJEXT, LINESEP);
  80.     fputs (fname, f);
  81.       }
  82.     }
  83.   }
  84.   closedir (dirp);
  85. }
  86.  
  87. void handle_wild2 (FILE *f, char *dir, char *wild)
  88. {
  89.   int m, n;
  90.   DIR *dirp;
  91.   char *cp, fname[256];
  92.   struct dirent *dep;
  93.   struct stat stbuf;
  94.  
  95.   if ((dirp = opendir (dir)) == NULL) fail ("Illegal directory name", dir);
  96.  
  97.   while ((dep = readdir (dirp)) != NULL)
  98.   {
  99.     sprintf (fname, "%s%c%s", dir, DIRSEP, dep->d_name);
  100.     stat (fname, &stbuf);
  101.     strlwr (fname);
  102.     if ((stbuf.st_mode & S_IFMT) != S_IFDIR)   /* skip dirs */
  103.     {
  104.       if (((m = strlen(fname)) >= (n = strlen(wild))) &&
  105.              (!strcmp (fname + m - n, wild)))
  106.       {
  107.         strcpy (fname, dep->d_name);
  108.         strlwr (fname);
  109.     cp = strrchr(fname, '.');   /* strip extension */
  110.     *cp = 0;
  111.     fprintf (f, "$(ODIR)%c%s.%s : %s%c%s%s\n", DIRSEP, fname, OBJEXT, 
  112.                                                dir, DIRSEP, fname, wild);
  113.     fprintf (f, "\t$(CC) $(CFLAGS) %s %s%c%s%s %s$(ODIR)%c%s.%s\n",
  114.            SOURCE, dir, DIRSEP, fname, wild, OBJECT, DIRSEP, fname, OBJEXT);
  115.     fprintf (f, "\n");
  116.       }
  117.     }
  118.   }
  119.   closedir (dirp);
  120. }
  121.  
  122. void handle_dir(FILE *f, char *line)
  123. {
  124.   char fname[100];
  125.  
  126.   sscanf (line, "%s", fname);
  127.   handle_wild (f, fname, ".c");
  128.   handle_wild (f, fname, ".cc");
  129.   handle_wild (f, fname, ".S");
  130. }
  131.  
  132. void handle_dir2(FILE *f, char *line)
  133. {
  134.   char fname[100];
  135.  
  136.   sscanf (line, "%s", fname);
  137.   handle_wild2 (f, fname, ".c");
  138.   handle_wild2 (f, fname, ".cc");
  139.   handle_wild2 (f, fname, ".S");
  140. }
  141.  
  142. int main()
  143. {
  144.   FILE *fin, *fout;
  145.   char buf[200];
  146.  
  147.   if ((fin = fopen(MAKETMPL, "r")) == NULL) fail ("Unable to open", MAKETMPL);
  148.   if ((fout = fopen(MAKEFILE, "w")) == NULL) fail ("Unable to open", MAKEFILE);
  149.   fprintf(fout, "# This file is generated from maketmpl by mm.c\n");
  150.   while (fgets(buf, 200, fin) != NULL)
  151.   {
  152.     if (strncmp(buf, "@dir ", 5) == 0)
  153.       handle_dir(fout, buf+5);
  154.     else if (strncmp(buf, "@dir2 ", 6) == 0)
  155.       handle_dir2(fout, buf+6);
  156.     else
  157.       fputs(buf, fout);
  158.   }
  159.   fclose(fin);
  160.   fclose(fout);
  161.   return 0;
  162. }
  163.